package de.fhffm.gärtnerei.gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.fhffm.gärtnerei.exceptions.InputException;
import de.fhffm.gärtnerei.tabellen.Art;
import de.fhffm.gärtnerei.tabellen.Farbe;
import de.fhffm.gärtnerei.tabellen.Herkunft;
import de.fhffm.gärtnerei.tabellen.Pflanze;
import de.fhffm.gärtnerei.tabellen.Schaerfegrad;

public class NeuePflanzeFenster implements ActionListener {
	
	private JButton btnOk = new JButton("OK");
	private JButton btnAbbrechen = new JButton("Abbrechen");
	
	private JLabel labelSorte = new JLabel("Sorte");
	private JLabel labelArt = new JLabel("Art");
	private JLabel labelHerkunft = new JLabel("Herkunft");
	private JLabel labelFarbe = new JLabel("Farbe");
	private JLabel labelReifezeit = new JLabel("Reifezeit");
	private JLabel labelSchaerfegrad = new JLabel("Schaerfegrad");
	private JLabel labelErtrag = new JLabel("Ertrag");
	
	private JTextField txtSorte = new JTextField(8);
	private JTextField txtHerkunft = new JTextField(8);
	private JTextField txtFarbe = new JTextField(8);
	private JTextField txtReifezeit = new JTextField(8);
	private JTextField txtErtrag = new JTextField(8);
	
	private JFrame neuePflanzeFrame = new JFrame();
	
	private JPanel eingabePanel = new JPanel(new GridLayout(7,2));
	private JPanel buttonPanel = new JPanel();
	
	private String[] arten = { "C.annum","C.baccatum","C.chinese","C.frutescens","C.pubescens"};
	private String[] schaerfe = {"1","2","3","4","5","6","7","8","9","10"};
	private String artString = null;
	private String farbeString = null;
	private String herkunftString = null;
	private String sorte = null;
	private String ertragString = null;

	private int schaerfegradInt = 0;
	private int reifezeit = 0;
	private int ertrag = 0;
	
	StringBuilder sb = new StringBuilder();
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private JComboBox artListe = new JComboBox(arten);
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private JComboBox schaerfeListe = new JComboBox(schaerfe);
	
	private Farbe farbe = new Farbe();;
	private Art art = new Art();
	private Herkunft herkunft = new Herkunft();
	private Schaerfegrad schaerfegrad = new Schaerfegrad();
	
	public NeuePflanzeFenster(){
		
		neuePflanzeFrame.setTitle("Neue Pflanze");	
		neuePflanzeFrame.setSize(400,500);
		neuePflanzeFrame.setLocationRelativeTo(null);
		neuePflanzeFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		neuePflanzeFrame.setVisible(true);
		neuePflanzeFrame.setResizable(true);
		neuePflanzeFrame.setLayout(new BorderLayout());
		
		eingabePanel.add(labelSorte);
		eingabePanel.add(txtSorte);
		eingabePanel.add(labelArt);
		eingabePanel.add(artListe);
		eingabePanel.add(labelHerkunft);
		eingabePanel.add(txtHerkunft);
		txtHerkunft.setToolTipText("Das Land aus der die Pflanze kommt");
		eingabePanel.add(labelFarbe);
		eingabePanel.add(txtFarbe);
		eingabePanel.add(labelReifezeit);
		eingabePanel.add(txtReifezeit);
		txtReifezeit.setToolTipText("Eine für die Sorte übliche Reifezeit in Tagen");
		eingabePanel.add(labelSchaerfegrad);
		eingabePanel.add(schaerfeListe);
		eingabePanel.add(labelErtrag);
		eingabePanel.add(txtErtrag);
		txtErtrag.setToolTipText("Ein für die Sorte üblicher Ertrag in gramm");
		
		buttonPanel.add(btnOk);
		buttonPanel.add(btnAbbrechen);
		
		btnOk.addActionListener(this);
		btnAbbrechen.addActionListener(this);
		
		neuePflanzeFrame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
		neuePflanzeFrame.getContentPane().add(eingabePanel,BorderLayout.CENTER);
		

	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object obj = e.getSource();

		if (obj == btnAbbrechen) {	
			neuePflanzeFrame.dispose();
		}
		
		if(obj == btnOk){
	
			if(ueberpruefeEingabe()){
				
				if(pflanzeNichtVorhanden()){ 
					pruefeSchaerfegrad();
					pruefeFarbe();
					pruefeHerkunft();
					pruefeArt();
					fuegePflanzeEin();
					einfügenEnde();
					
				}else{
					System.out.println("Pflanze schon vorhanden!");
				}
			
			} else{
				
				System.out.println("Eingabe Fehler");
			}
		}
	}
	


	private void einfügenEnde() {
		
		Object[] options = {"Fertig!","Neue Pflanze!"};
		int selected = JOptionPane.showOptionDialog(null,"Pflanze hinzugefügt!", "Hinzufügen Erfolgreich", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0:
			neuePflanzeFrame.dispose();
			break;
		case 1:
			loescheTextFelder();
			break;
		}
	}

	private void loescheTextFelder() {
		
		txtErtrag.setText(null);
		txtFarbe.setText(null);
		txtHerkunft.setText(null);
		txtReifezeit.setText(null);
		txtSorte.setText(null);	
		artListe.setSelectedIndex(0);
		schaerfeListe.setSelectedIndex(0);
		
	}

	private boolean ueberpruefeEingabe() {
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (InputException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Ertrag,Schärfegrad und Reifezeit nur Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
		
	}
	
	private boolean hohleEingabe() throws InputException,NumberFormatException {
		
		artString = (String) artListe.getSelectedItem();
		farbeString = txtFarbe.getText();
		herkunftString = txtHerkunft.getText();
		sorte = txtSorte.getText();
		schaerfegradInt = Integer.parseInt((String) schaerfeListe.getSelectedItem());
		reifezeit = Integer.parseInt(txtReifezeit.getText());
		ertrag = Integer.parseInt(txtErtrag.getText());
		sb.append(ertrag).append(" gramm");
		ertragString = sb.toString();
		sb.setLength(0);
		
		if(isEingabeLeer()){
			
			throw new InputException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen eingeben!");
			
		
		}else{
			
			return true;

		}
	}

	private boolean isEingabeLeer() {
	
		if(farbeString.length() == 0 || herkunftString.length() == 0 || sorte.length() == 0 || schaerfegradInt <= 0 || reifezeit <= 0 || ertrag <= 0){
		
			return true;
		
		}else{
		
			return false;
		
		}
	}
	

	private void fuegePflanzeEin() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
	    Query q = em.createQuery("SELECT s FROM Schaerfegrad s WHERE  s.schaerfegrad = :name");
	    		  q.setParameter("name",schaerfegradInt);
    	
    		Schaerfegrad schaerfegrad = (Schaerfegrad) q.getSingleResult();
    	
    		
    	q = em.createQuery("SELECT h FROM Herkunft h WHERE  h.land = :name");
         	q.setParameter("name",herkunftString);
        
        Herkunft herkunft = (Herkunft) q.getSingleResult();
        
	    q = em.createQuery("SELECT a FROM Art a WHERE  a.art = :name");
    		q.setParameter("name",artString);
    	
    	Art art = (Art) q.getSingleResult();
        
		q = em.createQuery("SELECT f FROM Farbe f WHERE  f.farbe = :name");
     	 	q.setParameter("name", farbeString);
        
     	Farbe farbe = (Farbe) q.getSingleResult();
    	
		Pflanze pflanze = new Pflanze();
		
		pflanze.setSchaerfegrad(schaerfegrad);
		schaerfegrad.getPflanze().add(pflanze);
		
		pflanze.setHerkunft(herkunft);
		herkunft.getPflanze().add(pflanze);
		
		pflanze.setArt(art);
		art.getPflanze().add(pflanze);
		
		pflanze.setFarbe(farbe);
		farbe.getPflanze().add(pflanze);
		
		pflanze.setErtrag(ertragString);
		pflanze.setReifezeit(reifezeit);
		pflanze.setSorte(sorte);
		
		em.persist(schaerfegrad);
		em.persist(art);
		em.persist(herkunft);
		em.persist(farbe);
		em.persist(pflanze);
		em.getTransaction().commit();
		em.close();
		
		
	}
	

	private void pruefeSchaerfegrad() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em1 = factory.createEntityManager();
		em1.getTransaction().begin();
		
		
	    Query q = em1.createQuery("SELECT s FROM Schaerfegrad s WHERE  s.schaerfegrad = :name");
	        	q.setParameter("name",schaerfegradInt);

	   if(q.getResultList().isEmpty()){
		   em1.clear();
		   em1.close();
		   System.out.println("Schaerfegrad noch nicht vorhanden!");
		   fuegeSchaerfegradEin();
	   }else{
		   em1.close();
		   System.out.println("Schaerfegrad schon vorhanden");
	   }
	}

	private void fuegeSchaerfegradEin() {
	
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em1 = factory.createEntityManager();
		em1.getTransaction().begin();
		
		Schaerfegrad schaerfegrad = new Schaerfegrad();
		
		schaerfegrad.setSchaerfegrad(schaerfegradInt);
		
		em1.persist(schaerfegrad);
		em1.getTransaction().commit();
		em1.close();
		
		
	}

	private void pruefeHerkunft() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
	    Query q = em.createQuery("SELECT h FROM Herkunft h WHERE  h.land = :name");
	        	q.setParameter("name",herkunftString);
	
	        
	   if(q.getResultList().isEmpty()){
		   em.close();
		   System.out.println("Herkunft noch nicht vorhanden!");
		   fuegeHerkunftein();
	   }else{
		   System.out.println("Herkunft schon vorhanden!");
	   }
		
	}

	private void fuegeHerkunftein() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Herkunft herkunft = new Herkunft();
		
		herkunft.setLand(herkunftString);
		em.persist(herkunft);
		em.getTransaction().commit();
		em.close();
	        	
		
	}

	private void pruefeArt() {
	
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
	    Query q = em.createQuery("SELECT a FROM Art a WHERE  a.art = :name");
	        	q.setParameter("name",artString);

	        
	   if(q.getResultList().isEmpty()){
		   em.clear();
		   em.close();
		   System.out.println("Art noch nicht vorhanden!");
		   fuegeArtEin();
	   }else{
		   em.clear();
		   em.close();
	   }
		
	}

	private void fuegeArtEin() {
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Art art = new Art();
		
		art.setArt(artString);
		em.persist(art);
		em.getTransaction().commit();
		em.close();
		
	}

	private void pruefeFarbe() {
	
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT f FROM Farbe f WHERE  f.farbe = :name");
      	 q.setParameter("name", farbeString);

      	 
      	 if(q.getResultList().isEmpty()){
      		em.clear();
      		em.close();
      		 System.out.println("Farbe noch nicht vorhanden!");
      		 fuegeFarbeEin();
 
      	 }else{

      		em.clear();
      		em.close();
      		 System.out.println("Farbe schon vorhanden!");
      	 }
		
	}

	private void fuegeFarbeEin() {
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Farbe farbe = new Farbe();
		farbe.setFarbe(farbeString);
		
		em.persist(farbe);
		em.getTransaction().commit();
		em.close();
	}

	public boolean pflanzeNichtVorhanden() {
		
		boolean isVorhanden = false;
		try {
			isVorhanden = ueberpruefePflanze();
			
		} catch (InputException e) {
			System.out.println("Pflanze schon vorhanden Exception!");
		}

		return isVorhanden;
					  
	}
	
	public boolean ueberpruefePflanze() throws InputException{

		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT p FROM Pflanze p WHERE  p.sorte = :name");
   	 			  q.setParameter("name", sorte);
   	 			  
   	 	if(q.getResultList().size() == 0){
   	   	 	em.close();   
   	   	    System.out.println("Pflanzen Sorte noch nicht vorhanden.");
   	   	    return true;
   	 		   
   	 	 }else{
   	   	    em.close();
   	   	    throw new InputException("Pflanzen Sorte schon vorhanden.");
   	 	   
   	 	 }
	}
}
